import * as vscode from 'vscode';
import { 翻译标识符 } from './ctsTranslate/translateIdentifier';
import { 标识符或文本不需要翻译 } from './ctsUtils/utils';
import { 反向词典, 增加的词典 } from './ctsCommands/externalDictEditCommand';
const 正则 = /^\s*"(.+)?"\s*:/;

const 整体表头 = `[整体译文:](#)\n\n---\n\n|[原  文](#)| |[译  文](#)|\n|:---:|:---:|:---:|`;
const 分部表头 = `\n\n---\n\n[标识构成:](#)\n\n---\n\n|[原  文](#)| |[译  文](#)|\n|:---:|:---:|:---:|`;
export class 词典悬浮提示提供者_ implements vscode.HoverProvider {
	public async provideHover(
		document: vscode.TextDocument,
		position: vscode.Position): Promise<vscode.Hover | undefined> {
		if (!document.fileName.endsWith("dictconfig.json")) {
			return undefined;
		}
		const 词范围 = document.getWordRangeAtPosition(position);
		let 标识符文本 = document.getText(词范围);
		标识符文本 = 标识符文本.slice(1, -1);
		if (!标识符或文本不需要翻译(标识符文本)) {
			const 翻译好的标识符 = await 翻译标识符({ 原文: 标识符文本 });
			if (翻译好的标识符.译文组 && 翻译好的标识符.译文组.length) {
				const 内容组: string[] = [];
				内容组.push(整体表头);
				翻译好的标识符.译文组.forEach(v => {
					内容组.push(`|${标识符文本}| |${v.译文}|`);
				});
				if (翻译好的标识符.组成) {
					内容组.push(分部表头)
					翻译好的标识符.组成.forEach(v => {
						if (v.原文 && v.原文 !== "_" && v.译文组 && v.译文组.length) {
							let 多个部分: string[] = []
							v.译文组.forEach(ii => {
								多个部分.push(ii.译文)
							})
							内容组.push(`|${v.原文}| |${多个部分.join(" ")}|`)
						}
					});
				}
				return new vscode.Hover(内容组.join("\n"));
			}
		}
		else {
			if (反向词典 && 反向词典.has(标识符文本)) {
				const 行文本 = document.lineAt(position.line).text;
				let 词键!: string;
				const 匹配 = 正则.exec(行文本); if (匹配) {
					词键 = 匹配[1];
				}
				if (词键 && 反向词典.get(标识符文本) !== 词键) {
					return new vscode.Hover(`[词典说明:](#)\n\n---\n\n词典: [${词键}:${标识符文本}](#) 与词典: [${反向词典.get(标识符文本)}:${标识符文本}](#) 内容冲突`);
				}
				else {
					return new vscode.Hover(`[词典说明:](#)\n\n---\n\n标识符: [${标识符文本}](#) 是唯一标识符`);
				}
			}
			if (增加的词典 && 增加的词典.has(标识符文本)) {
				return new vscode.Hover(`[词典说明:](#)\n\n---\n\n标识符: [${标识符文本}](#) 是唯一标识符`);
			}
		}
		return undefined;
	}
}
